/**
 * 4399游戏网站后端API服务
 * 主入口文件
 */

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const morgan = require('morgan');
const path = require('path');
const config = require('./config');

// 导入路由
const authRoutes = require('./routes/auth');
const userRoutes = require('./routes/users');
const gameRoutes = require('./routes/games');

// 初始化Express应用
const app = express();

// 为了测试，跳过MongoDB连接
console.log('警告: 跳过MongoDB连接,使用模拟数据库');

/*
// 连接MongoDB数据库
mongoose.connect(config.database.uri, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    autoIndex: true // 确保索引创建
})
.then(() => {
    console.log('MongoDB数据库连接成功');
})
.catch((err) => {
    console.error('MongoDB数据库连接失败:', err);
    process.exit(1);
});
*/

// 中间件
app.use(express.json()); // 解析JSON请求体
app.use(express.urlencoded({ extended: true })); // 解析URL编码的请求体

// 启用CORS
app.use(cors({
    origin: config.server.corsOrigin,
    methods: ['GET', 'POST', 'PUT', 'DELETE'],
    allowedHeaders: ['Content-Type', 'Authorization']
}));

// 请求日志
if (process.env.NODE_ENV === 'development') {
    app.use(morgan('dev'));
}

// 添加成功响应日志中间件
app.use((req, res, next) => {
    // 保存原始的res.json方法
    const originalJson = res.json;
    
    // 重写res.json方法以添加日志
    res.json = function(body) {
        // 在响应发送后记录成功状态
        res.on('finish', () => {
            if (res.statusCode >= 200 && res.statusCode < 300) {
                console.log(`✅ 成功: ${req.method} ${req.originalUrl} - ${res.statusCode}`);
            }
        });
        
        // 调用原始方法
        return originalJson.call(this, body);
    };
    
    next();
});

// 静态文件目录
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));

// API路由
app.use('/api/v1/auth', authRoutes);
app.use('/api/v1/users', userRoutes);
app.use('/api/v1/games', gameRoutes);

// 404处理
app.use((req, res, next) => {
    res.status(404).json({
        success: false,
        message: `API endpoint not found: ${req.originalUrl}`
    });
});

// 错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    
    const statusCode = err.statusCode || 500;
    const message = err.message || '服务器内部错误';
    
    res.status(statusCode).json({
        success: false,
        message,
        stack: process.env.NODE_ENV === 'development' ? err.stack : undefined
    });
});

// 设置环境变量
const PORT = process.env.PORT || 3000; // 修改端口为3000
const NODE_ENV = process.env.NODE_ENV || 'development';

// 启动服务器
const server = app.listen(PORT, () => {
    console.log(`服务器运行在端口: ${PORT}, 环境: ${NODE_ENV}`);
});

// 处理未捕获的异常
process.on('uncaughtException', (err) => {
    console.error('未捕获的异常:', err);
    process.exit(1);
});

// 处理未处理的Promise拒绝
process.on('unhandledRejection', (err) => {
    console.error('未处理的Promise拒绝:', err);
    server.close(() => {
        process.exit(1);
    });
});

module.exports = app; 